package com.aizuda.boot.modules.common.util;


import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import java.io.File;
import java.io.IOException;

/**
 * 在 PDF 指定页指定位置插入纯文本（左对齐，无背景、无边框）
 */
public class PdfTextInserterUtil {
    /**
     * 在 PDF 指定页指定位置插入纯文本（左对齐，无背景、无边框）
     *
     * @param inputPath  输入 PDF 文件路径
     * @param outputPath 输出 PDF 文件路径（不能与输入路径相同）
     * @param text       要插入的文字
     * @param pageIndex  插入的页码（从 0 开始）
     * @param x          起始横坐标（pt）
     * @param y          起始纵坐标（pt）
     * @param fontSize   字体大小（pt）
     * @throws IOException 文件读写异常
     */
    public static void insertText(String inputPath, String outputPath, String text,
                                  int pageIndex, float x, float y, float fontSize) throws IOException {
        if (inputPath.equals(outputPath)) {
            throw new IllegalArgumentException("输出路径不能与输入路径相同");
        }

        try (PDDocument document = PDDocument.load(new File(inputPath))) {
            if (pageIndex < 0 || pageIndex >= document.getNumberOfPages()) {
                throw new IllegalArgumentException("页码超出范围，总页数为：" + document.getNumberOfPages());
            }

            PDPage page = document.getPage(pageIndex);
            PDRectangle mediaBox = page.getMediaBox();

            if (x < 0 || y < 0 || x > mediaBox.getWidth() || y > mediaBox.getHeight()) {
                throw new IllegalArgumentException("插入坐标超出页面范围");
            }

            try (PDPageContentStream contentStream = new PDPageContentStream(
                    document, page, PDPageContentStream.AppendMode.APPEND, true)) {

                contentStream.beginText();
                contentStream.setFont(PDType1Font.HELVETICA_BOLD, fontSize);
                contentStream.newLineAtOffset(x, y);
                contentStream.showText(text);
                contentStream.endText();
            }

            document.save(outputPath);
        }
    }

    /**
     * 获取 PDF 第一页的页面高度（用于计算顶部位置）
     */
    public static float getFirstPageHeight(String inputPath) throws IOException {
        try (PDDocument document = PDDocument.load(new File(inputPath))) {
            return document.getPage(0).getMediaBox().getHeight();
        }
    }

    public static void main(String[] args) throws Exception {
        String inputPath = "/Users/apple/Downloads/test.pdf";
        String outputPath = "/Users/apple/Downloads/test_output.pdf";
        String text = "PB-2025-001-"+System.currentTimeMillis();

        float fontSize = 12;
        float pageHeight = PdfTextInserterUtil.getFirstPageHeight(inputPath);

        float x = 10; // 左边距
        float y = pageHeight - fontSize - 10; // 顶部偏移 10pt

        PdfTextInserterUtil.insertText(inputPath, outputPath, text, 0, x, y, fontSize);
    }
}
